import axios from 'axios'
import Vue from 'vue'
import router from '../router/index.js'
import { MessageBox } from 'element-ui';

let isTokenPrompting = false; //
axios.defaults.withCredentials = true;
// 测试
// let loginPath = 'https://test-usercenter.bsedu.com/login'
// 正式
const vm = new Vue()
const loginPath = vm.$loginUrl
import { decrypt } from '../utils/cryptojs'
axios.defaults.withCredentials = true; // 允许携带cookie


// function startLoading() { //使用Element loading-start 方法
//     loading = Loading.service({
//         lock: true,
//         text: '加载中',
//         background: 'rgba(0, 0, 0, 0.3)',
//         spinner: "el-icon-loading",
//     })
// }
// function endLoading() { //使用Element loading-close 方法
//     loading.close()
// }

//那么 showFullScreenLoading() tryHideFullScreenLoading() 要干的事儿就是将同一时刻的请求合并。
//声明一个变量 needLoadingRequestCount，每次调用showFullScreenLoading方法 needLoadingRequestCount + 1。
//调用tryHideFullScreenLoading()方法，needLoadingRequestCount - 1。needLoadingRequestCount为 0 时，结束 loading。
// let needLoadingRequestCount = 0
// export function showFullScreenLoading() {
//     if (needLoadingRequestCount == 0) {
//         startLoading()
//     }
//     needLoadingRequestCount++

// }
// function tryHideFullScreenLoading() {
//     if (needLoadingRequestCount <= 0) return
//     needLoadingRequestCount--
//     if (needLoadingRequestCount == 0) {
//         endLoading()
//     }
// }

// 请求拦截
// axios.interceptors.request.use(config=>{
// 	// //console.info(config,config.url.split("/"),'rrrrr')
// 	let obj = config.url
// 	let arr = obj.split("/")
// 	let flag = false
// 	arr.map(res => {
// 		  if (res == 'api') {
// 			  flag = true
// 		  }
// 	})
// 	//console.info(arr)
// 	  let  userinfo=decrypt(localStorage.getItem("accessToken"))
// 	  if (userinfo) {  // 判断是否存在token，如果存在的话，则每个http header都加上token
// 		if (flag) {
// 			if(config.url.indexOf('login') == -1){
// 				config.headers.Authorization = '';
// 			}
// 			config.headers.Authorization = JSON.parse(userinfo).token;
// 		}
// 	  } else {
// 		if (config.url.indexOf('login') == -1) {
// 			router.push('/login')
// 		}
// 	  }
// 	return config
// })
function getLoginUrl() {
  const env = process.env.NODE_ENV;

  if (env === 'development') {
    return 'http://localhost:8082/login?isToken=false';
  } else if (env == "stage") {
    // return 'https://usercenter.bsedu.com/login?isToken=false';
    return 'https://test-usercenter.bsedu.com/login?isToken=false';
  } else {
    return 'https://www.bsedu.com/login?isToken=false';
  }
}

const isApiRequest = (url) => url.split("/").includes("api");
const isLoginRequest = (url) => url.endsWith('/auth/login');
axios.interceptors.request.use((config) => {
  // console.info('url',config.url)
  // //console.info(config)
  //   const userinfo = decrypt(localStorage.getItem("accessToken"));
  // config.headers.Authorization = 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjI5MTAwMTg3LTEyOTktNGVjOC04MjZhLThjN2U4Y2M5YTRmZiJ9.G62XGZDu3berHb8mlQ3CPAU7uQ9d8s_5jDDBaTPxiHlT9qYdaZYpJpavbvI1exRrRz4F9Fdf31CMw0s6xWLvMg';
  const userinfo = localStorage.getItem("token");
  if (userinfo) {
    if (isApiRequest(config.url) && !isLoginRequest(config.url)) {
      const token = localStorage.getItem('token');
      if (token) {
        config.headers.Authorization = 'Bearer ' + token;
      }
    }
  } else {
    if (!isLoginRequest(config.url)) {
      // router.push("/login");
      // window.location.href = loginPath
      window.location.href = getLoginUrl();

    }
  }

  return config;
}, error => {
  // //console.info(error)
});
//响应拦截
// axios.interceptors.response.use(res => {
//   document.getElementById('systemup').style.display = 'none'

//   // 统一处理token失效情况
//   if (res.data.msg == 'token认证失败 ,请重新登录' || res.data.msg == 'token认证失败') {
//     // 先清除已有token
//     localStorage.removeItem('token')

//     // 存储当前路径
//     let path = router.history.current.path
//     sessionStorage.setItem('urlPath', path)

//     // 跳转登录页
//     // router.push({
//     //     path:'/login'
//     // });
//     // window.location.href = loginPath
//     window.location.href = getLoginUrl();
//     // 只在这里显示一次错误提示
//     if (!Vue.prototype.$isTokenErrorShown) {
//       Vue.prototype.$message.error('登录已过期，请重新登录');
//       Vue.prototype.$isTokenErrorShown = true;
//       setTimeout(() => {
//         Vue.prototype.$isTokenErrorShown = false;
//       }, 3000);
//     }

//     return Promise.reject(res.data);
//   }

//   return res.data
// }, err => {
//   // 处理请求超时
//   if (err.code === 'ECONNABORTED') {
//     Vue.prototype.$message.error('请求超时，请稍后重试');
//     return Promise.reject(err);
//   }
//   // 处理401未授权
//   if (err.response && err.response.status === 401) {
//     localStorage.removeItem('token');
//     isTokenPrompting = true;
//     MessageBox.confirm(
//       '登录状态已过期，您可以继续留在该页面，或者重新登录',
//       '系统提示',
//       {
//         confirmButtonText: '重新登录',
//         cancelButtonText: '取消',
//         type: 'warning',
//         showClose: false,
//         closeOnClickModal: false,
//         closeOnPressEscape: false
//       }
//     )
//       .then(() => {
//         // 用户点击“重新登录”
//         localStorage.removeItem('token');
//         localStorage.removeItem('accessToken');
//         sessionStorage.clear();
//         window.location.href = getLoginUrl();
//       })
//       .catch(() => {
//         // 用户点击“取消”
//         isTokenPrompting = false;
//       });
//   }

//   return Promise.reject(err);
// })
axios.interceptors.response.use(res => {
  document.getElementById('systemup').style.display = 'none';

  if (res.data.msg === 'token认证失败 ,请重新登录' || res.data.msg === 'token认证失败') {
    // ⚠️ early return：如果弹窗已在显示，就不再处理
    if (isTokenPrompting) return Promise.reject(res.data);

    isTokenPrompting = true;

    // MessageBox 是 Promise 的，可以强制流程阻塞
    return MessageBox.confirm(
      '登录状态已过期，您可以继续留在该页面，或者重新登录',
      '系统提示',
      {
        confirmButtonText: '重新登录',
        cancelButtonText: '取消',
        type: 'warning',
        showClose: false,
        closeOnClickModal: false,
        closeOnPressEscape: false
      }
    )
      .then(() => {
        // 用户点击“重新登录”
        localStorage.removeItem('token');
        localStorage.removeItem('accessToken');
        sessionStorage.clear();
        isTokenPrompting = false;
        window.location.href = getLoginUrl();
      })
      .catch(() => {
        // 用户点击“取消”
        isTokenPrompting = false;
      })
      .finally(() => {
        // 返回 rejected 让原始请求识别为失败
        return Promise.reject(res.data);
      });
  }

  return res.data;
}, err => {
  console.log('进入 response 错误拦截器', err);
  // 处理请求超时
  if (err.code === 'ECONNABORTED') {
    Vue.prototype.$message.error('请求超时，请稍后重试');
    return Promise.reject(err);
  }

  // 处理 401 未授权
  if (err.response && err.response.status === 401) {
    // console.log('检测到 401，准备弹窗');
    // ⚠️ early return：如果弹窗已在显示，就不再处理
    if (isTokenPrompting) return Promise.reject(err);
    // console.log('弹窗已存在，跳过重复弹窗');
    isTokenPrompting = true;

    return MessageBox.confirm(
      '登录状态已过期，您可以继续留在该页面，或者重新登录',
      '系统提示',
      {
        confirmButtonText: '重新登录',
        cancelButtonText: '取消',
        type: 'warning',
        showClose: false,
        closeOnClickModal: false,
        closeOnPressEscape: false
      }
    )
      .then(() => {
        localStorage.removeItem('token');
        localStorage.removeItem('accessToken');
        sessionStorage.clear();
        isTokenPrompting = false;
        window.location.href = getLoginUrl();
      })
      .catch(() => {
        isTokenPrompting = false;
      })
      .finally(() => {
        return Promise.reject(err);
      });
  }

  return Promise.reject(err);
});
axios.defaults.timeout = 600000; // 600秒超时
